
package projetoestrutura;

import edu.uci.ics.jung.algorithms.filters.KNeighborhoodFilter;
import edu.uci.ics.jung.algorithms.layout.CircleLayout;
import edu.uci.ics.jung.algorithms.layout.FRLayout;
import edu.uci.ics.jung.algorithms.layout.Layout;
import edu.uci.ics.jung.algorithms.shortestpath.DijkstraShortestPath;
import edu.uci.ics.jung.graph.DirectedGraph;
import edu.uci.ics.jung.graph.Graph;
import edu.uci.ics.jung.visualization.VisualizationViewer;
import edu.uci.ics.jung.visualization.control.DefaultModalGraphMouse;
import edu.uci.ics.jung.visualization.control.ModalGraphMouse;
import edu.uci.ics.jung.visualization.decorators.ToStringLabeller;
import edu.uci.ics.jung.visualization.renderers.Renderer.VertexLabel.Position;
import java.awt.Dimension;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Collection;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JOptionPane;
import javax.swing.event.MenuEvent;
import javax.swing.event.MenuListener;
import projetoestrutura.Grafo.MyLink;
import projetoestrutura.Grafo.MyNode;


public class ProjetoEstrutura 
{

    //FUNCIONANDO dado um aluno qualquer o sistema deverá mostrar o menor caminho para que ele possa se comunicar com qualquer outro aluno
    public static void menorCaminho(Grafo.MyNode n1, Grafo.MyNode n2, DirectedGraph<Grafo.MyNode, Grafo.MyLink> g)
    {
        DijkstraShortestPath<Grafo.MyNode, Grafo.MyLink> menor = new DijkstraShortestPath(g);
        List<Grafo.MyLink> l = menor.getPath(n1, n2);
        
        JOptionPane.showMessageDialog(null, "O menor caminho é: " + l.toString());
    }
    
    // FUNCIONANDO listar a quantidade máxima de alunos que podem ser contatados a partir de um aluno qualquer se a distância máxima(caminho limitado a uma quantidade máxima de arestas) entre este aluno e os demais for limitada aos seguintes valores: 1, 2, 3, 4 e 5
    public static void qtdMaxAlunosPorK(Grafo.MyNode n, DirectedGraph<Grafo.MyNode, Grafo.MyLink> g, int k)
    {
        KNeighborhoodFilter<Grafo.MyNode, Grafo.MyLink> filtro = new KNeighborhoodFilter<>(n, k, KNeighborhoodFilter.EdgeType.OUT);
        Graph<Grafo.MyNode, Grafo.MyLink> g2 = filtro.transform(g);
        
        Layout<Grafo.MyNode, Grafo.MyLink> layout = new FRLayout(g2);
        layout.setSize(new Dimension(500,500));
        
        VisualizationViewer vv = new VisualizationViewer(layout);
        vv.setPreferredSize(new Dimension(600,600));
        vv.getRenderContext().setVertexLabelTransformer(new ToStringLabeller());
        vv.getRenderContext().setEdgeLabelTransformer(new ToStringLabeller());
        vv.getRenderer().getVertexLabelRenderer().setPosition(Position.CNTR);  
        
        DefaultModalGraphMouse gm = new DefaultModalGraphMouse();
        gm.setMode(ModalGraphMouse.Mode.TRANSFORMING);
        vv.setGraphMouse(gm);  
        
        JFrame frame = new JFrame("Alunos que podem ser contatados a distância " + k);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(vv);
        frame.pack();
        frame.setAlwaysOnTop(true);
        frame.setVisible(true);
    }
    
    public static void naoVisitados(Grafo.MyNode n, DirectedGraph<Grafo.MyNode, Grafo.MyLink> g)
    {
        KNeighborhoodFilter<Grafo.MyNode, Grafo.MyLink> filtro = new KNeighborhoodFilter<>(n, g.getEdgeCount(), KNeighborhoodFilter.EdgeType.OUT);
        Graph<Grafo.MyNode, Grafo.MyLink> g2 = filtro.transform(g);
        
        Collection<MyNode> v = g.getVertices();
        Collection<MyNode> v1 = g2.getVertices();
        
        v.removeAll(v1);
        
        JOptionPane.showMessageDialog(null, "Os alunos não visitados são: " + v.toString());
    }
    
    public static void main(String[] args) throws FileNotFoundException, IOException
    {
        JFrame f = new JFrame();
        final Grafo g = new Grafo();
        DirectedGraph<MyNode, MyLink> g2 = g.leitura();
        
        Layout<Grafo.MyNode, Grafo.MyLink> layout = new FRLayout(g2);
        layout.setSize(new Dimension(1000,1000));
        
        VisualizationViewer vv = new VisualizationViewer(layout);
        vv.setPreferredSize(new Dimension(1200,1200));
        vv.getRenderContext().setVertexLabelTransformer(new ToStringLabeller());
        vv.getRenderContext().setEdgeLabelTransformer(new ToStringLabeller());
        vv.getRenderer().getVertexLabelRenderer().setPosition(Position.CNTR);  
        
        DefaultModalGraphMouse gm = new DefaultModalGraphMouse();
        gm.setMode(ModalGraphMouse.Mode.TRANSFORMING);
        vv.setGraphMouse(gm);  
        
        JFrame frame = new JFrame("Projeto de Estrutura - Grafos");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(vv);
        
        JMenuBar b = new JMenuBar();
        
        JMenu menu = new JMenu();
        menu.setPreferredSize(new Dimension(100,20));
        menu.setText("Menor Caminho | ");
        menu.addMenuListener(  
                new MenuListener() {  
                    public void menuSelected(MenuEvent e) { 
                        MenorCaminho m = new MenorCaminho();
                        m.setAlwaysOnTop(true);
                        m.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                        m.setLocationRelativeTo(null);
                        m.setVisible(true);
                    }  
  
                    public void menuDeselected(MenuEvent e) {}  
                    public void menuCanceled(MenuEvent e) {}  
                }  
        );  

        b.add(menu);
        
        JMenu menu2 = new JMenu();
        menu2.setPreferredSize(new Dimension(320,20));
        menu2.setText("Número Máximo de Alunos Contatados a Distância K  |");
        menu2.addMenuListener(new MenuListener() {

            @Override
            public void menuSelected(MenuEvent e) {
                MaxAlunosK m = new MaxAlunosK();
                m.setAlwaysOnTop(true);
                m.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                m.setLocationRelativeTo(null);
                m.setVisible(true);
                //int rm = Integer.valueOf(JOptionPane.showInputDialog(null, "Digite o RM do aluno:"));
                //int k =Integer.valueOf(JOptionPane.showInputDialog(null, "Digite a distância k desejada:"));
                //qtdMaxAlunosPorK(g.buscarRM(rm),Grafo.g,k);
            }

            @Override
            public void menuDeselected(MenuEvent e) {
            }

            @Override
            public void menuCanceled(MenuEvent e) {
            }
        });
        
        b.add(menu2);
        
        JMenu menu3 = new JMenu();
        menu3.setPreferredSize(new Dimension(200,20));
        menu3.setText("Alunos não visitados");
        menu3.addMenuListener(new MenuListener() {

            @Override
            public void menuSelected(MenuEvent e) {
                SemContato m = new SemContato();
                m.setAlwaysOnTop(true);
                m.setLocationRelativeTo(null);
                m.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                m.setVisible(true);
                //int rm = Integer.valueOf(JOptionPane.showInputDialog(null, "Digite o RM do aluno:"));
                //naoVisitados(g.buscarRM(rm),Grafo.g);
            }

            @Override
            public void menuDeselected(MenuEvent e) {
            }

            @Override
            public void menuCanceled(MenuEvent e) {
            }
        });
        
        b.add(menu3);
        
        frame.setJMenuBar(b);
        frame.pack();
        frame.setVisible(true);
        
        
        
    } 
    
}
    

